/*********************************************************************************************************************
* TC264 Opensourec Library ����TC264 ��Դ�⣩��һ�����ڹٷ� SDK �ӿڵĵ�������Դ��
* Copyright (c) 2022 SEEKFREE ��ɿƼ�
*
* ���ļ��� TC264 ��Դ���һ����
*
* TC264 ��Դ�� ��������
* �����Ը��������������ᷢ���� GPL��GNU General Public License���� GNUͨ�ù������֤��������
* �� GPL �ĵ�3�棨�� GPL3.0������ѡ��ģ��κκ����İ汾�����·�����/���޸���
*
* ����Դ��ķ�����ϣ�����ܷ������ã�����δ�������κεı�֤
* ����û�������������Ի��ʺ��ض���;�ı�֤
* ����ϸ����μ� GPL
*
* ��Ӧ�����յ�����Դ���ͬʱ�յ�һ�� GPL �ĸ���
* ���û�У������<https://www.gnu.org/licenses/>
*
* ����ע����
* ����Դ��ʹ�� GPL3.0 ��Դ���֤Э�� �����������Ϊ���İ汾
* �������Ӣ�İ��� libraries/doc �ļ����µ� GPL3_permission_statement.txt �ļ���
* ���֤������ libraries �ļ����� �����ļ����µ� LICENSE �ļ�
* ��ӭ��λʹ�ò����������� ���޸�����ʱ���뱣����ɿƼ��İ�Ȩ����������������
*
* �ļ�����          zf_device_mt9v03x
* ��˾����          �ɶ���ɿƼ����޹�˾
* �汾��Ϣ          �鿴 libraries/doc �ļ����� version �ļ� �汾˵��
* ��������          ADS v1.8.0
* ����ƽ̨          TC264D
* ��������          https://seekfree.taobao.com/
*
* �޸ļ�¼
* ����              ����                ��ע
* 2022-09-15       pudding            first version
********************************************************************************************************************/
/*********************************************************************************************************************
* ���߶��壺
*                  ------------------------------------
*                  ģ��ܽ�             ��Ƭ���ܽ�
*                  TXD                �鿴 zf_device_mt9v03x.h �� MT9V03X_COF_UART_TX �궨��
*                  RXD                �鿴 zf_device_mt9v03x.h �� MT9V03X_COF_UART_RX �궨��
*                  PCLK               �鿴 zf_device_mt9v03x.h �� MT9V03X_PCLK_PIN �궨��
*                  VSY                �鿴 zf_device_mt9v03x.h �� MT9V03X_VSYNC_PIN �궨��
*                  D0-D7              �鿴 zf_device_mt9v03x.h �� MT9V03X_DATA_PIN �궨�� �Ӹö��忪ʼ�������˸�����
*                  VCC                3.3V��Դ
*                  GND                ��Դ��
*                  ������������
*                  ------------------------------------
********************************************************************************************************************/

#ifndef _zf_device_mt9v03x_h_
#define _zf_device_mt9v03x_h_

#include "zf_common_typedef.h"
#include "zf_device_type.h"

//=================================================MT9V03X ��������====================================================
#define MT9V03X_COF_UART        (UART_1)                                        // ��������ͷ��ʹ�õ��Ĵ���
#define MT9V03X_COF_BAUR        (9600)                                          // ��������ô��ڲ�����
#define MT9V03X_COF_UART_TX     (UART1_RX_P02_3)                                // ����� UART-TX ���� Ҫ���ڵ�Ƭ�� RX ��
#define MT9V03X_COF_UART_RX     (UART1_TX_P02_2)                                // ����� UART-RX ���� Ҫ���ڵ�Ƭ�� TX ��

#define MT9V03X_COF_IIC_DELAY   (800)                                           // ����� IIC ��ʱ
#define MT9V03X_COF_IIC_SCL     (P02_3)                                         // ����� IIC-SCL ����
#define MT9V03X_COF_IIC_SDA     (P02_2)                                         // ����� IIC-SDA ����

#define MT9V03X_DMA_CH          (IfxDma_ChannelId_5)

#define MT9V03X_PCLK_PIN        (ERU_CH2_REQ14_P02_1)                           // PCLK �����ź� TIM_ETR ���Ž�ֹ�����޸�

#define MT9V03X_VSYNC_PIN       (ERU_CH3_REQ6_P02_0)                            // ���ж�����

#define MT9V03X_DATA_PIN        (P00_0)                                         // �������� ������ ֻ���� GPIOx0 ���� GPIOx8 ��ʼ �����˸��������� F0-F7
#define MT9V03X_DATA_ADD        (get_port_in_addr(MT9V03X_DATA_PIN))

#define MT9V03X_INIT_TIMEOUT    (0x0080)                                        // Ĭ�ϵ�����ͷ��ʼ����ʱʱ�� ����Ϊ��λ
//=================================================MT9V03X ��������====================================================

//=================================================MT9V03X ��������====================================================
#define MT9V03X_W               (188)                                           // ͼ����     ��Χ [1-752]
#define MT9V03X_H               (120)                                           // ͼ��߶�     ��Χ [1-480]

#define COL               (188)                                           // ͼ����     ��Χ [1-752]
#define ROW               (120)                                           // ͼ��߶�     ��Χ [1-480]

#define MT9V03X_IMAGE_SIZE      (MT9V03X_W * MT9V03X_H)                         // ����ͼ���С���ܳ��� 65535

#define MT9V03X_AUTO_EXP_DEF    (32 ) //20                                           // �Զ��ع�����     Ĭ�ϲ������Զ��ع�����  ��Χ [0-63] 0Ϊ�ر�
                                                                                //              ����Զ��ع⿪��  EXP_TIME���������Զ��ع�ʱ�������
                                                                                //              һ������ǲ���Ҫ�����Զ��ع����� ����������߷ǳ������ȵ�������Գ��������Զ��ع⣬����ͼ���ȶ���
#define MT9V03X_EXP_TIME_DEF    (200)                                           // �ع�ʱ��        ����ͷ�յ�����Զ����������ع�ʱ�䣬������ù���������Ϊ�������������ع�ֵ
#define MT9V03X_FPS_DEF         (50 )                                           // ͼ��֡��        ����ͷ�յ�����Զ���������FPS���������������Ϊ������������FPS
#define MT9V03X_LR_OFFSET_DEF   (0  )                                           // ͼ������ƫ����    ��ֵ ��ƫ��   ��ֵ ��ƫ��  ��Ϊ188 376 752ʱ�޷�����ƫ��
                                                                                //              ����ͷ��ƫ�����ݺ���Զ��������ƫ�ƣ�������������ü�����������ƫ��
#define MT9V03X_UD_OFFSET_DEF   (0  )                                           // ͼ������ƫ����    ��ֵ ��ƫ��   ��ֵ ��ƫ��  ��Ϊ120 240 480ʱ�޷�����ƫ��
                                                                                //              ����ͷ��ƫ�����ݺ���Զ��������ƫ�ƣ�������������ü�����������ƫ��
#define MT9V03X_GAIN_DEF        (32 )                                           // ͼ������        ��Χ [16-64]  ����������ع�ʱ��̶�������¸ı�ͼ�������̶�
#define MT9V03X_PCLK_MODE_DEF   (0  )                                           // ����ʱ��ģʽ      ��Χ [0-1]    Ĭ�ϣ�0 ��ѡ����Ϊ��[0������������ź�,1����������ź�]
                                                                                //               ͨ��������Ϊ0�����ʹ��CH32V307��DVP�ӿڻ�STM32��DCMI�ӿڲɼ���Ҫ����Ϊ1
                                                                                //               ������� MT9V034 V1.5 �Լ����ϰ汾֧�ָ�����
//=================================================MT9V03X ��������====================================================


//==============================================���� MT9V03X ����ö����==================================================
typedef enum
{
    MT9V03X_INIT = 0,                                                           // ����ͷ��ʼ������
    MT9V03X_AUTO_EXP,                                                           // �Զ��ع�����
    MT9V03X_EXP_TIME,                                                           // �ع�ʱ������
    MT9V03X_FPS,                                                                // ����ͷ֡������
    MT9V03X_SET_COL,                                                            // ͼ��������
    MT9V03X_SET_ROW,                                                            // ͼ��������
    MT9V03X_LR_OFFSET,                                                          // ͼ������ƫ������
    MT9V03X_UD_OFFSET,                                                          // ͼ������ƫ������
    MT9V03X_GAIN,                                                               // ͼ��ƫ������
    MT9V03X_PCLK_MODE,                                                          // ����ʱ��ģʽ����(�������MT9V034 V1.5�Լ����ϰ汾֧�ָ�����)
    MT9V03X_CONFIG_FINISH,                                                      // ������λ����Ҫ����ռλ����

    MT9V03X_COLOR_GET_WHO_AM_I = 0xEF,
    MT9V03X_SET_EXP_TIME = 0XF0,                                                // ���������ع�ʱ������
    MT9V03X_GET_STATUS,                                                         // ��ȡ����ͷ��������
    MT9V03X_GET_VERSION,                                                        // �̼��汾������

    MT9V03X_SET_ADDR = 0XFE,                                                    // �Ĵ�����ַ����
    MT9V03X_SET_DATA                                                            // �Ĵ�����������
}m9v03x_cmd_enum;

// ����ͷ�ӿ�����ö��
typedef enum
{
    MT9V03X_UART,                                                               // ͨ���������ò���
    MT9V03X_SCCB,                                                               // ͨ��SCCB���ò���
}m9v03x_type_enum;
//==============================================���� MT9V03X ����ö����==================================================

//==============================================���� MT9V03X ���ݴ洢����=================================================
extern vuint8    mt9v03x_finish_flag;                                           // һ��ͼ��ɼ���ɱ�־λ
extern uint8    mt9v03x_image[MT9V03X_H][MT9V03X_W];
extern uint8    out[COL*ROW]; // ͼ�����ݴ洢����
//==============================================���� MT9V03X ���ݴ洢����=================================================

//===================================================MT9V03X ��������==================================================
uint16      mt9v03x_get_version         (void);                                 // ��ȡ����ͷ�̼��汾
uint8       mt9v03x_set_exposure_time   (uint16 light);                         // ������������ͷ�ع�ʱ��
uint8       mt9v03x_set_reg             (uint8 addr, uint16 data);              // ������ͷ�ڲ��Ĵ�������д����
uint8       mt9v03x_init                (void);                                 // MT9V03X ����ͷ��ʼ��
//===================================================MT9V03X ��������==================================================

#endif
